package com.hyper_yang.javase;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

import static org.junit.jupiter.api.Assertions.assertEquals;

// 单元测试所在的类必须是公共类
// 单元测试的方法访问权限修饰符必须是 public
// 单元测试的方法返回值类型必须是 void
// 不支持返回数据，但是可以用断言机制来验证期望结果 assertEquals
// junit5 @ParameterizedTest 可以有传入参数
// 不支持键盘输入，但可以使用 @MethodSource 引用测试类或外部类的一个或多个工厂方法
public class MyTest {
    @Test
    public void testAdd() {
        int result = 2 + 2;
        assertEquals(4, result, "2 + 2 should be 4");
    }

    @DisplayName("加法参数化测试")
    @ParameterizedTest // 参数化测试
    @CsvSource({
            "2, 2, 4",    // a, b, expectedResult
            "1, 3, 4",
            "0, 4, 4"
    })
    void testAdd(int a, int b, int c) {
        int result = a + b;
        assertEquals(c, result, () -> a + " + " + b + " 应该等于 " + c);
    }

    @DisplayName("局部代码块测试")
    @Test
    void testLocalCodeBlock(){
        int a = 20;
        {
//            int a = 30; ❌ 重复定义
            a = 30;
            int c = 10;
        }
        System.out.println(a);
//        System.out.println(c); ❌ 访问不到，作用域
    }
}
